package com.cskaoyan.javase.oop1._6constructor._1assignment;

/**
 * 总结一下目前为止,在创建对象过程中,给成员变量赋值的手段:
 *      1.默认初始化,具有默认值
 *      2.显式赋值
 *      3.构造器赋值
 *
 * 在各式各样给成员变量赋值的方式中，构造器是最后执行的！！！
 * 不管后面还会学习多少赋值方式,一个类中成员变量的赋值,构造器永远最后执行!!
 *
 * 在研究成员变量赋值顺序时，要遵循"掐头去尾"的原则，三种赋值方式中：
 *      1.默认初始化永远的第一步，这是头。
 *      2.在创建对象过程中，无论我们后面还要学多少成员变量的赋值方式，构造器总是最后执行的。这是尾。
 *       注：由于构造器最后执行，那么标准格式书写的构造器的赋值一定是可靠和正确的。"永远可以相信构造器"
 *      3.显式赋值，见到二位大哥，只好屈居中间执行了。
 *
 *
 * 构造器使用的细节问题:
 *      1.构造器的标准格式书写格式,是非常固定的,所以构造器是可以在idea中自动生成的
 *          使用快捷键 alt + insert
 *          以后如果构造器没有特殊要求,建议直接快捷键生成,不要手写
 *
 *      2.一个类中只要提供了任何一个构造器,那么默认的无参构造器,就不会再提供了
 *          从良好的代码书写习惯角度出发,建议对需要创建对象的类,手动给出默认无参
 *
 *
 *      3.每当JVM在创建某个对象时,调用了构造器.该构造方法的方法栈帧同样会进栈
 *          用"<init>"方法来表示构造方法的方法栈帧
 *
 *      4.在任何程序员能够查看的代码执行之前,创建对象的过程已经结束了,对象中的成员变量已经具有了默认值
 *
 *      5,使用debug模式查看创建对象过程中,代码的执行:
 *          a.默认初始化最先进行,所有的赋值手段都要在默认值的基础上进行,
 *          b.new对象的构造器方法栈帧进栈(init方法栈帧)
 *          c.先执行显式赋值
 *          d.最后执行构造器代码
 *
 *
 * @since 10:10
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Game g1 = new Game("原神", 648, "米哈游", "MMORPG");
        g1.printInfo();

        Game g2 = new Game("英雄联盟", 6300, "Riot Game", "MOBA");
        g2.printInfo();
    }
}

class Game {
    String name = "王者荣耀";
    double price = 999;
    String maker = "腾讯";
    String category = "手游";

    // 默认无参
    public Game() {
    }

    // 四参构造器
    public Game(String name, double price, String maker, String category) {
        this.name = name;
        this.price = price;
        this.maker = maker;
        this.category = category;
    }

    // 参看属性取值,给出一个方法
    public void printInfo() {
        System.out.println(name + "这款游戏,由" + maker + "制作,属于" + category + "类,它的价格是" + price);
    }
}